<?php
/**
 * MongoDB 环境下的 action record 层
 * 
 * @author <Judasnow@gmail.com>
 */
class db_obj{

	 /**
	  * 存放对象的属性
	  *
	  */
	 private $property;
	 //存放表名对应的数据库资源变量
	 public $collection;
	 //对应表的索引
	 private $index;
	 
	 /**
	 * 初始化，并为相应的表建立相应的索引
	 *
	 * @param object $db 数据库链接
	 * @param string $collection_name 表的名称
	 * @param string $index 索引
	 */
	function __construct( $db , $collection_name , $index = null ){

		$this->collection = $db->$collection_name;
		$this->index = $index;
		//设置 $index 在表中有唯一的属性值 , 并为之建立索引
		$this->collection->ensureIndex( array( $index => 1 ) , array( 'unique' => 'true' ) );	
	}

	 /**
	  * 测试用的函数,输出全部属性值
	  * 
	  */  
	 function dump(){

	 	 echo json_encode( $this->property );
	 }

	 /**
	 * 在派生类中设置键及其默认值
	 *
	 */
	 protected function add( $key , $default = null ){

	 	 $this->property[$key] = $default;
	 }

	/**
	 * 设置当前对象中的键值对
	 * 
	 */
	function set( $key , $value ){

		$this->property[$key] = $value;
	}

	/**
	 * 返回当前对象中由所给键对应的值
	 * @todo 有没有必要判断空值 以返回异常?
	 */
	function get( $key ){

		return $this->property[$key];
	}

	/**
	 * 保存当前对象进数据库的相应的表之中
	 *
	 */
	function save(){
	 	
		return $this->collection->insert( $this->property );
	}

	/**
	 * 根据提供的键值对 从数据库的相应表之中取出
	 * 相应的记录
	 *
	 */
	 function load( $key , $value ){

	 	 //清空该对象中原有的数据,以防污染
	 	 //从数据库中取出来的信息
	 	 foreach( $this->property as $k => $v ){

	 	 	 $this->property[$k] = '';
		  }

	 	 $result = $this->collection->findOne( array( $key=>$value ));
	 
	 	 if ( $result ){

	 	 	 foreach( $result as $k => $v ){	 

	 	 	 	 $this->property[$k] = $v;
	 	 	 }

		 	 return true;
	  
	 	 }else{

		 	 return false;
	 	 }			
	 
	 }

	/**
	 * 更新相应的记录
	 *
	 */
	function update( $where , $key , $value  ){
		 
	 	 $new_data = array( '$set' => array( $key => $value ));		
		 return $this->collection->update( $where , $new_data );
	}

	/**
	 * 删除相应的记录
	 *
	 */
	function delete( $key , $value ){

		return $this->collection->remove( array ( $key=>$value ) );

	}
}
?>
